const path = require("path");
const bodyParser = require("body-parser"); // post参数转换
const { request } = require("http");
// 数据
const { commodityList } = require('./src/mock')
const port = 8888;
const title = "电商后台";

function resolve(dir) {
    // 拼接当前文件所在目录和dir
    return path.join(__dirname, dir);
}

module.exports = {
    lintOnSave: false,
    devServer: {
        port,
        proxy: {
            // 客户端和服务端直接有个 同源策略 要求同域名通端口同协议
            // 代理是怎么实现跨域的
            // 多重代理
            // 因为有两个不同的服务器

            '/socket.io': {     //这里最好有一个 /
                target: 'http://localhost:3000',  // 后台接口域名
                ws: true,        //如果要代理 websockets，配置这个参数
                changeOrigin: true,  //是否跨域
            },
            'sockjs-node': {     //这里最好有一个 /
                target: 'http://localhost:3000',  // 后台接口域名
                ws: true,        //如果要代理 websockets，配置这个参数
                changeOrigin: true,  //是否跨域
            },
            '/dev-api': {     //这里最好有一个 /
                target: 'http://localhost:8888',  // 后台接口域名
                ws: true,        //如果要代理 websockets，配置这个参数
                secure: false,  // 如果是https接口，需要配置这个参数
                changeOrigin: true,  //是否跨域
                pathRewrite: {
                    '^/dev-api': '/dev-api'
                    // /dev-api/xxx
                    // 发起一个一模一样的 http://localhost:8888/dev-api/xxx
                }
            },
            '/upload': {
                target: 'http://182.254.220.243:7001',  // 后台接口域名
                ws: true,        //如果要代理 websockets，配置这个参数
                secure: false,  // 如果是https接口，需要配置这个参数
                changeOrigin: true,  //是否跨域
                pathRewrite: {
                    '^/upload': '' // 替换别名
                    // /upload/xxx
                    // http://182.254.220.243:7001/xxx
                }
            },
            '/api': {
                target: 'http://182.254.220.243:9003',  // 后台接口域名
                ws: true,        //如果要代理 websockets，配置这个参数
                secure: false,  // 如果是https接口，需要配置这个参数
                changeOrigin: true,  //是否跨域
                pathRewrite: {
                    '^/api': '' // 替换别名
                    // /upload/xxx
                    // http://182.254.220.243:7001/xxx
                }
            }
        },
        before: app => {
            app.use(bodyParser.json()); // 处理post参数
            // 登录接口
            app.post("/dev-api/user/login", (req, res) => {
                const { username } = req.body;
                // 模拟账号登录 admin 管理员 kkk 普通用户
                if (username === "admin" || username === "kkk") {
                    res.json({
                        code: 1,
                        data: username,
                    });
                } else {
                    res.json({
                        code: 10204,
                        message: "用户名或密码错误",
                    });
                }
            });
            // 获取角色
            app.get("/dev-api/user/info", (req, res) => {
                const auth = req.headers["authorization"];
                // 模拟角色 admin 管理员 editor普通用户
                const roles = auth.split(" ")[1] === "admin" ? ["admin"] : ["editor"];
                res.json({
                    code: 1,
                    data: roles,
                });
            });
            // 商品列表
            app.get('/dev-api/commodity/list', (req, res) => {
                //  分类查询 模糊查询 状态切换 分页
                const { pageIndex, pageSize, classId, keyword, status } = req.query; // 取出来全是string
                let newList = JSON.parse(JSON.stringify(commodityList)); // 深拷贝 为了不修改mock数据
                // 分类查询
                if (classId) {
                    newList = newList.filter(item => item.classId * 1 === classId * 1)
                }
                // 模糊查询  名称 关键词 id
                if (keyword) {
                    newList = newList.filter(item => (item.id === keyword || item.title.includes(keyword) || item.keyword.includes(keyword)))
                }
                // 状态查询
                if (status) {
                    newList = newList.filter(item => item.status * 1 === status * 1)
                }
                // 分页
                if (pageIndex && pageSize) {
                    newList = newList.slice((pageIndex - 1) * pageSize, pageIndex * pageSize)
                }
                let onSale = 0, warehouse = 0, sellOut = 0, recycleBin = 0;
                commodityList.forEach(item => {
                    switch (item.status) {
                        case 1:
                            onSale += 1;
                            break;
                        case 2:
                            warehouse += 1;
                            break;
                        case 0:
                            sellOut += 1;
                            break;
                        case -1:
                            recycleBin += 1;
                            break;
                    }
                })
                res.send({
                    code: 1,
                    data: {
                        list: newList,// 筛选以后的数组
                        total: status * 1 === 1 ? onSale : status * 1 === 2 ? warehouse : status * 1 === 0 ? sellOut : status * 1 === -1 ? recycleBin : commodityList.length,// 总数
                        onSale,
                        warehouse,
                        sellOut,
                        recycleBin
                    }
                })
            })
        },
    },
    configureWebpack: {
        name: title,
    },
    chainWebpack(config) {
        //修改文件引入自定义路径
        config.resolve.alias
            .set('@', path.resolve(__dirname, './src'))
            .set('@c', path.resolve(__dirname, './src/components'))
            .set('@css', path.resolve(__dirname, './src/assets/css'))
            .set('@img', path.resolve(__dirname, './src/assets/img'))
            .set('@js', path.resolve(__dirname, './src/assets/js'))
        // 1.修改svg规则，排除icons目录下的svg文件
        config.module.rule("svg").exclude.add(resolve("src/icons"));
        // 2.新增icons规则，仅打包icons目录下的svg文件
        config.module
            .rule("icons")
            .test(/\.svg$/)
            .include.add(resolve("src/icons"))
            .end()
            .use("svg-sprite-loader")
            .loader("svg-sprite-loader")
            .options({ symbolId: "icon-[name]" })
            .end();
    },
};
